package fr.afcepf.al22.qualite.data;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import javax.sql.DataSource;

import fr.afcepf.al22.qualite.data.util.Al22DataSource;
import fr.afcepf.al22.qualite.entitee.Personne;
/**
 * Implementation JDBC pour la persistence Objet
 * Relationnelle de l'entité {@link Personne}.
 * @author Stagiaire
 *
 */
public class DaoPersonneImpl implements IDaoPersonne {
    /**
     * DataSource pour la connexion a la BDD 'al22'.
     */
    private DataSource ds = new Al22DataSource();
    /**
     * requete pour ajouter une Personne.
     */
    private String reqAjout =
            "INSERT INTO personne (nom,mail,mdp,naissance)"
          + " VALUES (?,?,?,?)";
    /**
     * indice du parametre nom dans la requete
     * {@link DaoPersonneImplsa#reqAjout}.
     */
    private final int indiceNomAjout = 1;
    /**
     * indice du parametre Mail dans la requete
     * {@link DaoPersonneImplsa#reqAjout}.
     */
    private final int indiceMailAjout = 2;
    /**
     * indice du parametre Mdp dans la requete
     * {@link DaoPersonneImplsa#reqAjout}.
     */
    private final int indiceMdpAjout = 3;
    /**
     * indice du parametre Naissance dans la requete
     * {@link DaoPersonneImplsa#reqAjout}.
     */
    private final int indiceNaissanceAjout = 4;
    /**
     * indice du parametre id genere par la requete
     * {@link DaoPersonneImplsa#reqAjout}.
     */
    private final int indiceIdGenere = 1;
    @Override
    public Personne ajouter(Personne paramPers) {
        Connection cnx = null;
        try {
           cnx = ds.getConnection();
           PreparedStatement pstmt =
                   cnx.prepareStatement(reqAjout,
                           Statement.RETURN_GENERATED_KEYS);
           pstmt.setString(indiceMdpAjout, paramPers.getMdp());
           pstmt.setString(indiceNomAjout, paramPers.getNom());
           pstmt.setString(indiceMailAjout, paramPers.getMail());
           pstmt.setDate(indiceNaissanceAjout,
                   new java.sql.Date(paramPers.getNaissance()
                           .getTime()));
           int nbLigne = pstmt.executeUpdate();
           ResultSet rsKey = pstmt.getGeneratedKeys();
           if (nbLigne == 1 && rsKey.next()) {
               System.out.println("COUCOU");
               paramPers.setId(rsKey.getInt(indiceIdGenere));
           }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                cnx.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        return paramPers;
    }
    /**
     * requete de recherche de personne par nom.
     */
    private final String reqRechercher =
            "SELECT p.* FROM personne p WHERE p.nom = ?";
    /**
     * indice param 'nom' dans 'reqRechercher'.
     */
    private final int indiceParamNomFind = 1;
    @Override
    public List<Personne> rechercher(String paramNom) {
        List<Personne> liste = new ArrayList<>();
        Connection cnx = null;
        try {
            cnx = ds.getConnection();
            PreparedStatement pstmt =
                cnx.prepareStatement(reqRechercher);
            pstmt.setString(indiceParamNomFind,
                    "%" + paramNom + "%");
            ResultSet rs = pstmt.executeQuery();
            while (rs.next()) {
                liste.add(rsToPersonne(rs));
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                cnx.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        return liste;
    }
    /**
     * requete de verification de l'adresse mail.
     */
    private final String reqVerifMail =
            "SELECT p.* FROM personne p WHERE "
            + "p.mail = ?";
    /**
     * indice du parametre 'mail' dans la requete
     * 'verifMail'.
     */
    private final int indiceParamMailVerif = 1;
    @Override
    public Personne verifMail(String paramMail) {
        Personne p = null;
        Connection cnx = null;
        try {
            cnx = ds.getConnection();
            PreparedStatement pstmt =
                    cnx.prepareStatement(reqVerifMail);
            pstmt.setString(indiceParamMailVerif, paramMail);
            ResultSet rs = pstmt.executeQuery();
            if (rs.next()) {
                p = rsToPersonne(rs);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                cnx.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        return p;
    }
    /**
     * Methode pour convertir une ligne de ResultSet
     * en entitée Personne;
     * @param rs le ResultSet.
     * @return la Personne.
     */
    private Personne rsToPersonne(ResultSet rs) {
        Personne pers = null;
        try {
            pers = new Personne(rs.getInt("id"),
                    rs.getString("nom"),
                    rs.getString("mail"),
                    rs.getString("mdp"),
                    rs.getDate("naissance"));
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return pers;
    }
}

